package com.mazaiting.cryption.sm.sm2;

import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;

/**
 * SM2 非对称加密工具管理
 *
 * @author mazaiting
 * @create_time 2022/4/4 09:26
 */
public class SM2Util {

//    /**
//     * 私钥
//     * 用于生产环境时使用配置
//     */
//    private static final String PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgph0mUXA/1on/ZkUuDXcxHaW/cuHykM//PqF2sZi98iugCgYIKoEcz1UBgi2hRANCAAS+2PpbfTiWpAyVFnCl04v+947eWjNHxW5VHfPoRRMzOcH/JhPWEPLy/g61Mg6zxidah6SFUXYdV2f5g4R6Pr/t";
//
//    /**
//     * 公钥
//     * 用于生产环境时使用配置
//     */
//    private static final String PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEvtj6W304lqQMlRZwpdOL/veO3lozR8VuVR3z6EUTMznB/yYT1hDy8v4OtTIOs8YnWoekhVF2HVdn+YOEej6/7Q==";

    //    public static void main(String[] args) {
//        String text = "我是一段测试aaaa";
//
//        KeyPair pair = SecureUtil.generateKeyPair("SM2");
//        byte[] privateKeyBytes = pair.getPrivate().getEncoded();
//        byte[] publicKeyBytes = pair.getPublic().getEncoded();
//        // 私钥字符串
//        String privateKey = Base64.getEncoder().encodeToString(privateKeyBytes);
//        // 公钥字符串
//        String publicKey = Base64.getEncoder().encodeToString(publicKeyBytes);
//        System.out.println(privateKey);
//        System.out.println(publicKey);
//        // 公私钥字符串
//        byte[] newPrivateKeyBytes = Base64.getDecoder().decode(privateKey);
//        byte[] newPublicKeyBytes = Base64.getDecoder().decode(publicKey);
//        cn.hutool.crypto.asymmetric.SM2 sm2 = SmUtil.sm2(newPrivateKeyBytes, newPublicKeyBytes);
//        // 公钥加密，私钥解密
//        String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
//        System.out.println(encryptStr);
//        String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
//        System.out.println(decryptStr);
//    }

    /**
     * 加密数据
     *
     * @param data 明文数据
     * @return 密文
     */
    public static String encrypt(String privateKey, String publicKey, String data) {
        SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
        return sm2.encryptBcd(data, KeyType.PublicKey);
    }

    /**
     * 解密数据
     *
     * @param data 密文数据
     * @return 明文
     */
    public String decrypt(String privateKey, String publicKey, String data) {
        SM2 sm2 = SmUtil.sm2(privateKey, publicKey);
        return new String(sm2.decryptFromBcd(data, KeyType.PrivateKey));
    }
}
